package com.leyou.common.advice;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.Arrays;

@Slf4j
@Aspect
@Component
public class CommonLogAdvice {

    @Around("within(@org.springframework.stereotype.Service *)||within(com.baomidou.mybatisplus.extension.service.IService+)")
    // jp 切点
    public Object handleException(ProceedingJoinPoint jp) throws Throwable {
        try {
            // 记录方法进入日志
            //Signature 方法签名  包括（包名和类名）
            //getArgs 得到方法参数
            log.debug("{}方法准备调用：{}",jp.getSignature(), Arrays.toString(jp.getArgs()));
            //当前时间
            long a = System.currentTimeMillis();
            //调用方法切点
            Object proceed = jp.proceed();
            //记录方法退出日志
            log.debug("{}方法调用成功，执行耗时{}",jp.getSignature(),System.currentTimeMillis()- a);
            return proceed;
        } catch (Throwable throwable) {
            log.error("{}方法执行失败，原因：{}",jp.getSignature(),throwable.getMessage(),throwable);
            //判断异常是否是LyException
            if (throwable instanceof LyException){
                // 如果是，不处理，直接抛出
                throw throwable;
            }else {
                //如果不是，转为LyException
                throw new LyException(500,throwable);
            }
        }
    }
}
